
#ifndef __ENTITY_BASE___IMPLEMENATION
#define __ENTITY_BASE___IMPLEMENATION

#include "EntityIf.h"
#include "EntityDefinition.h"
#include <hash_map>


//
//	EntityImp
//
class TCOM_API  EntityImp : public IEntity
{
public:

	EntityImp(int nType = Entity::ett_Base);
	virtual ~EntityImp();

	//
	//	callback to load entity datas
	//
	virtual bool	onLoad();

	//	
	//	Static ID
	//	ID for static data
	//
	virtual void	setStaticID(int nID)	;
	virtual int		getStaticID()const	;

	//	
	//	ID
	//	ID that in a scene scope
	//	This is an instance id generate when entity enter a scene
	//	It is used frequently for logic between entities in the same scene
	//
	virtual void	setID(int nID)	;
	virtual int		getID()const	;

	//
	//	Global ID
	//	Session ID
	//
	virtual void	setGlobalID(int nGrpID)	;
	virtual int		getGlobalID()const		;

	//
	//	Entity Type
	//
	virtual short	getType()const	;

	//	
	//	Static ID
	//	ID for static data
	//
	virtual void	setLevel(int v)	;
	virtual int		getLevel()const	;

	//
	//	Entity Name
	virtual void			setName(const string& n) ;
	virtual const string&	getName()const ;

	//
	//	Position
	//
	virtual void	setPosition(const int& x, const int& y, const int& z)	;
	virtual void	getPosition(int& x, int& y, int& z)const	;

	//
	//	Direction
	//
	virtual void	setDirection(const int& x, const int& y, const int& z)	;
	virtual void	getDirection(int& x, int& y, int& z)const	;
	//
	//	Visible
	//
	virtual void	setVisible(const int& v);
	virtual int		getVisible()const;

	//
	//	Speed Modifier
	//
	virtual void	setSpeedModifier(const int& v)	;
	virtual int		getSpeedModifier()const	;

	//
	//		Entity Global State
	//
	virtual void	setGState(const short& st) ;
	virtual short	getGState()const	 ;

	//
	//		Entity Moving State
	//
	virtual void	setMoveState(const short& st) ;
	virtual short	getMoveState()const	 ;

	virtual void				setMoveController(IMoveController* pMC);
	virtual IMoveController*	getMoveController();

	//
	//		Entity Combat State
	//
	virtual void	setCombatState(const short& st) ;
	virtual short	getCombatState()const	;

	virtual ICombatSys*	getCombatSys();
	virtual void		setCombatSys(ICombatSys* pCombat);

	virtual	void		setFaction(short f);
	virtual	short		getFaction()const;

	//
	//	observer
	//
	virtual void		setObserver(IObs* pObs);
	virtual IObs*		getObserver();

	//
	//	input and output device
	//
	virtual void		setInputDevice(IMsgListener* pMsgTgt);
	virtual void		setOutputDevice(IMsgListener* pMsgTgt);
	virtual IMsgListener*	getInputDevice();
	virtual IMsgListener*	getOutputDevice();


	//
	//		Entity Extension Properties
	//
	virtual	int		getProps(const short& nIdx, int d)const	;
	virtual void	setProps(const short& nIdx, int v)		;

	//
	//		Entity Flags
	//
	virtual void	setFlg(const short& nIdx)	;
	virtual	void	clrFlg(const short& nIdx)	;
	virtual bool	hasFlg(const short& nIdx)	;


	//
	//		Static Entity Data
	//
	virtual	IDataEx*	getStaticEntityData()	;
	virtual void		setStaticEntityData(IDataEx* pSED)	;

	//
	//		For entity visitor to visit current interface
	virtual bool	accept(IEntityVisitor& v) ;

	//
	//		Entity current scene
	//
	virtual	IScene*		getScene();

	//
	//		sub entities management
	//
	virtual IEntityManager*	getEntityMgr();

	//
	//	for genes
	//
	//
	//	add/remove gene to gene host
	//	Note that gene is organized by group id in gene
	//
	virtual bool addGene(IGeneCreateData* pDynamicData);
	virtual	bool addGene(IGene*);
	virtual bool rmvGene(int nGrpID);

	//
	//	register/unregister an gene event to gene host
	//	gene host will broadcast gene event only to those who has already registered it
	//
	virtual bool	addRegEvt(int nEvtGrp, int nEvt, IGene* pGene);
	virtual bool	rmvRegEvt(int nEvtGrp, int nEvt, IGene* pGene);

	//
	//	fire an gene event to all registered gene on current host
	//	
	virtual bool onEvent(IEvt& evt);
protected:

private:
	int			m_nStaticID;
	int			m_nID;
	int			m_nGlobalID;

	int			m_nLvl;
	short		m_nType;
	std::string		m_strName;

	int			m_nPosX, m_nPosY, m_nPosZ;
	int			m_nDirX, m_nDirY, m_nDirZ;

	int			m_nSpeedModifier;

	short		m_nMoveState;
	short		m_nCombatState;
	short		m_nGlobalState;

	int			m_nEntityFlg0_31;

	IDataEx*	m_wpStaticDataEx;

	
	//
	//	Combat system for current entity
	ICombatSys*			m_pCombatSys;
	//
	//	Move controller for current entity
	IMoveController*	m_pMoveController;
	IObs*			m_pObs;
	IMsgListener*		m_pInputDevice;
	IMsgListener*		m_pOutputDevice;

	//
	//	Entity attribute map
	typedef stdext::hash_map<int, int> AttrMap;
	AttrMap				m_attrs;

protected:
	//
	//	for gene host
	//
	typedef	std::map<int, IGene*>	GeneMap;
};


#endif
